package com.cnzhy.controller;

import com.cnzhy.entity.CrmAdminUser;
import com.cnzhy.services.interfaces.CrmAdminUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Author: zhaoyan5
 */
@RestController
public class CrmAdminUserController {

    /**
     * 不推荐使用字段注入
     */
    private CrmAdminUserService crmAdminUserService;

    /**
     * 推荐使用set方法注入
     */
    @Autowired
    public void setCrmAdminUserService(CrmAdminUserService crmAdminUserService) {
        this.crmAdminUserService = crmAdminUserService;
    }

    @GetMapping("user/{userId}")
    public CrmAdminUser getCrmAdminUser(@PathVariable long userId) {
        return crmAdminUserService.selectByPrimaryKey(userId);
    }

    @GetMapping("users")
    public List<CrmAdminUser> getAllCrmAdminUsers() {
        return crmAdminUserService.selectAllCrmAdminUsers();
    }

    /**
     * 使用声明式事务
     * 1. TransactionDefinition.PROPAGATION_REQUIRED：
     *    "如果当前存在事务，则加入该事务；如果当前没有事务，则创建一个新的事务。这是默认值。"
     * 2. TransactionDefinition.PROPAGATION_REQUIRES_NEW：
     *    "创建一个新的事务，如果当前存在事务，则把当前事务挂起。"
     * 3. TransactionDefinition.PROPAGATION_SUPPORTS：
     *    "如果当前存在事务，则加入该事务；如果当前没有事务，则以非事务的方式继续运行。"
     * 4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED：
     *    "以非事务方式运行，如果当前存在事务，则把当前事务挂起。"
     * 5. TransactionDefinition.PROPAGATION_NEVER：
     *    "以非事务方式运行，如果当前存在事务，则抛出异常。"
     * 6. TransactionDefinition.PROPAGATION_MANDATORY：
     *    "如果当前存在事务，则加入该事务；如果当前没有事务，则抛出异常。"
     * 7. TransactionDefinition.PROPAGATION_NESTED：
     *    "如果当前存在事务，则创建一个事务作为当前事务的嵌套事务来运行；"
     *    "如果当前没有事务，则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。"
     *
     *    1. @Transactional(isolation = Isolation.DEFAULT)
     *    "使用后端数据库默认的隔离级别 对于MYSQL来说就是可重复读"
     *
     * 1. @Transactional(isolation = Isolation.READ_UNCOMMITTED)
     *    "是最低的隔离级别，允许读取尚未提交的数据变更(会出现脏读,不可重复读)，基本不使用"
     *
     * 2. @Transactional(isolation = Isolation.READ_COMMITTED)
     *    "允许读取并发事务已经提交的数据(会出现不可重复读和幻读)"
     *
     * 3. @Transactional(isolation = Isolation.REPEATABLE_READ)
     *    "事物开启后，对同一字段的多次读取结果都是一致的，除非数据是被本身事务自己所修改(会出现幻读)"
     *
     * 4. @Transactional(isolation = Isolation.SERIALIZABLE)
     *    "最高的隔离级别，完全服从ACID的隔离级别，也是最慢的事务隔离级别，因为它通常是通过完全锁定事务相关的数据库表来实现的"
     *
     * MyBatis 提供了两级缓存机制：
     * 一级缓存（Local Cache）：也称为本地缓存，是 SqlSession 级别的缓存，默认开启。
     * 二级缓存（Global Cache）：也称为全局缓存，是 SqlSessionFactory 映射级别的缓存。二级缓存的作用域是 Mapper 级别，跨 SqlSession 有效。
     */
    @GetMapping("update/{userId}/{userName}")
    public CrmAdminUser updateCrmAdminUser(@PathVariable long userId, @PathVariable String userName) {
        return crmAdminUserService.updateCrmAdminUser(userId, userName);
    }

}
